extends Node
class_name 敌人AI

var 角色:角色单位

func _ready() -> void:
	角色 = owner

func 思考()-> AI行动信息:
	var data = 尝试攻击(角色.技能管理器.获取技能("普通近战攻击"))
	if data!=null:
		return data
	
	# 尝试移动后攻击
	return 尝试移动()


func 尝试移动():
	var 移动技能 = 角色.技能管理器.获取技能("移动")
	if 	角色.当前行动点数 < 移动技能.花费行动点数:
		return null
		
	# 尝试寻找最近的敌人
	# 获取所有敌人
	var 目标距离 = 999
	var 目标角色 = null
	for 敌人角色 in 游戏管理器.玩家角色集合:
		# 获取距离
		
		var path = 网格管理器.获取导航网格路径(角色.当前网格坐标, 敌人角色.当前网格坐标)
		var len = 网格管理器.获取网格路径长度(path)
		if  len < 目标距离:
			目标距离 = len
			目标角色 = 敌人角色
	if 目标角色==null:
		return null
	
	
	var 移动范围 = 移动技能.获取技能范围(角色.当前网格坐标)
	
	# 寻找移动后在目标周围最近的位置
	目标距离 = 999
	var 目标网格 = null
	for 网格 in 移动范围:
		var path = 网格管理器.获取导航网格路径(网格, 目标角色.当前网格坐标)
		var len = 网格管理器.获取网格路径长度(path)
		if  len < 目标距离:
			目标距离 = len
			目标网格 = 网格
	
	if 目标网格==null:
		return null
		
	var data = AI行动信息.new()
	data.技能 = 移动技能
	data.目标网格 = 目标网格
		
	return data
	

func 尝试攻击(攻击技能:技能基类)-> AI行动信息:
	if 攻击技能==null:
		return null
	if 	角色.当前行动点数 < 攻击技能.花费行动点数:
		return null
	
	var 目标角色集合:Array[角色单位] = 网格管理器.获取范围内的可攻击目标(角色, 攻击技能.获取技能范围())	
	if 目标角色集合.is_empty():
		return null
	
	# 选择可击杀或者伤害最大化的目标
	var 目标角色:角色单位 = 目标角色集合.pick_random()
	
	
	
	var data = AI行动信息.new()
	data.技能 = 攻击技能
	data.目标网格 = 目标角色.当前网格坐标
	
	return data


		
